// sushi-travel/utils/qiniuUploader.js

import { getQiniuToken } from '@/request/api.js';
import store from '@/store'; // 引入 Vuex store

// 七牛云华东-z0区的上传地址，请根据您的存储区域进行修改
// 华东 z0: https://up.qiniup.com
// 华北 z1: https://up-z1.qiniup.com
// 华南 z2: https://up-z2.qiniup.com
// 北美 na0: https://up-na0.qiniup.com
const QINIU_UPLOAD_URL = 'https://up.qiniup.com'; 

/**
 * 封装的七牛云文件上传函数
 * @param {object} options - 上传选项
 * @param {string} options.filePath - 必填，要上传的本地文件路径 (e.g., from uni.chooseImage)
 * @param {string} options.purpose - 必填，上传目的 (e.g., 'avatar', 'post_image', 'chat_video')，用于后端生成凭证
 * @param {string} [options.originalFilename] - 可选，原始文件名，用于生成更友好的key
 * @param {function} [options.onProgress] - 可选，上传进度回调函数，接收一个参数 (progress: number)
 * @returns {Promise<{url: string, key: string}>} - 返回一个包含文件URL和key的Promise
 */
export async function uploadFile({ filePath, purpose, originalFilename, onProgress }) {
    if (!filePath || !purpose) {
        const error = new Error('uploadFile: 缺少 filePath 或 purpose 参数');
        uni.showToast({ title: error.message, icon: 'none' });
        return Promise.reject(error);
    }
    
    // 如果没有提供原始文件名，从路径中生成一个
    const fileName = originalFilename || `file_${Date.now()}.${filePath.split('.').pop() || 'tmp'}`;

    try {
        // --- 步骤 1: 从您的后端获取上传凭证 ---
        console.log(`[Qiniu] 正在为 "${fileName}" (用途: ${purpose}) 获取上传凭证...`);
        const tokenRes = await getQiniuToken({ originalFilename: fileName, purpose });

        if (!tokenRes.data?.data?.token) {
            throw new Error('获取上传凭证失败，请检查网络或后端服务。');
        }
        
        const { token, key, domain } = tokenRes.data.data;
        // 如果后端没有返回CDN域名，使用store中的默认值
        const cdnDomain = domain || store.state.ossBaseUrl; 

        console.log(`[Qiniu] 凭证获取成功, key: ${key}`);

        // --- 步骤 2: 使用 uni.uploadFile 上传文件 ---
        return new Promise((resolve, reject) => {
            const uploadTask = uni.uploadFile({
                url: QINIU_UPLOAD_URL,
                filePath: filePath,
                name: 'file', // 这个字段通常是 'file'
                formData: {
                    token: token,
                    key: key, // key 是您在七牛云上保存的文件名
                },
                success: (uploadRes) => {
                    if (uploadRes.statusCode === 200) {
                        try {
                            const data = JSON.parse(uploadRes.data);
                            const finalUrl = `${cdnDomain}/${data.key}`;
                            console.log('[Qiniu] 上传成功!', { key: data.key, url: finalUrl });
                            resolve({
                                url: finalUrl,
                                key: data.key,
                            });
                        } catch (e) {
                             const parseError = new Error('解析七牛云响应失败');
                             console.error('[Qiniu] Error:', parseError, uploadRes.data);
                             reject(parseError);
                        }
                    } else {
                        const httpError = new Error(`上传失败，服务器响应: ${uploadRes.statusCode}`);
                        console.error('[Qiniu] Error:', httpError, uploadRes);
                        reject(httpError);
                    }
                },
                fail: (err) => {
                    const networkError = new Error('上传网络请求失败');
                    console.error('[Qiniu] Error:', networkError, err);
                    reject(networkError);
                }
            });

            // --- 步骤 3: 监听上传进度 ---
            if (typeof onProgress === 'function') {
                uploadTask.onProgressUpdate((res) => {
                    onProgress(res.progress);
                });
            }
        });

    } catch (error) {
        // 捕获获取凭证或上传过程中的任何错误
        console.error('[Qiniu] 整个上传流程出错:', error);
        uni.showToast({ title: error.message || '上传操作失败', icon: 'none' });
        return Promise.reject(error);
    }
}

// 方便以 `qiniuUploader.uploadFile()` 的形式调用
export default {
    uploadFile
};